/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.model.service;

import com.model.domain.dinero.ConglomeradoPersonalDetalle;
import com.model.domain.ubicacion.Conglomerado;
import com.model.domain.dinero.ConglomeradoPersonalResumen;
import com.model.domain.dinero.Partida;
import com.model.domain.dinero.ReporteMes;
import com.model.domain.dinero.ReporteAnual;
import com.model.domain.dinero.ReporteGeneral;
import com.model.domain.dinero.ReporteOdei;
import com.model.domain.dinero.ReportePeriodo;
import com.model.domain.persona.Cargo;
import com.model.domain.persona.Encuestador;
import com.model.domain.persona.Personal;
import com.model.domain.tiempo.Actividad;
import com.model.domain.tiempo.Mes;
import com.model.domain.tiempo.MesEnum;
import com.model.domain.tiempo.Periodo;
import com.model.domain.ubicacion.CentroPoblado;
import com.model.domain.ubicacion.Departamento;
import com.model.domain.ubicacion.Distrito;
import com.model.domain.ubicacion.Odei;
import com.model.domain.ubicacion.Provincia;
import com.model.domain.ubicacion.AreaGeografica;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import util.StringUtil;
import util.www.jdbc.Select2Jdbc;
import util.www.jdbc.SeteadorJdbc;
import util.www.sql.WhereSql;
import util.www.sql.WhereSqlCond;
import util.www.sql.WhereSqlDinamico;

/**
 *
 * @author Rdelacruz
 */
public class ConglomeradoPersonalResumenService
extends AbstractService
{
    private PersonalService personalService;
    private ActividadService actividadService;
    private PartidaService partidaService;
    
    private ConglomeradoService conglomeradoService;
    private MesService mesService;
    private OdeiService odeiService;
    private PeriodoService periodoService;
    private EncuestadorService encuestadorService;
    private ProgramacionPeriodoService programacionPeriodoService;
    private ConglomeradoPersonalDetalleService conglomeradoPersonalDetalleService;
    
    public ReporteGeneral<ConglomeradoPersonalResumen> findReporteAsignacionByFilter(Connection con, Conglomerado filtro) throws SQLException {
        final ReporteGeneral<ConglomeradoPersonalResumen> rep = new ReporteGeneral<ConglomeradoPersonalResumen>();        
        
        Select2Jdbc s = getSelectProgramacionTrabajoCampo(filtro);
        
        s.agregarSelect(
", O.NomOdei, DEP.NombreDD, PRO.NombrePV, CP.nomccpp, PP.fecha_inicio as inicio_periodo1"        
);
        s.agregarJoin(
"left join Odei O\n" +
"	on O.CodOdei=C.Odei\n"+
"left join Dpto DEP\n" +
"	on C.Dpto = DEP.CCDD\n" +
"left join Prov PRO\n" +
"	on C.Dpto = PRO.CCDD and C.Prov = PRO.CCPP\n"+
"left join \n" +
"(select \n" +
"CP.conglome,\n" +
"MIN(CP.nomccpp) as nomccpp\n" +
"from Campo_Centro_Poblado CP\n" +
"group by CP.conglome) CP\n" +
"	on C.Conglome = CP.conglome\n"+
"left join Programacion_Periodo PP\n" +
"	on C.Año=PP.Año and C.Mes=PP.Mes"        
        );
             
        
        s.setOrderby("order by Año,Odei,Mes,Periodo1,cargo desc,P.APEPATERNO");
        
        //System.out.println("SQL="+s.getSql());       
        
        final Map<String,Integer> ordenPersonas = new HashMap<String, Integer>();
        
        s.ejecutarTodo(con, new SeteadorJdbc<ConglomeradoPersonalResumen>() {
            @Override
            public void setear(Connection con, ResultSet rs, ConglomeradoPersonalResumen obj) throws SQLException { 
                obj.getConglomerado().getOdei().setNombre(rs.getString("NomOdei"));
                
                Departamento d = new Departamento();
                d.setNombre(rs.getString("NombreDD"));
                
                Provincia prov = new Provincia();
                prov.setNombre(rs.getString("NombrePV"));
                prov.setDepartamento(d);
                
                obj.getConglomerado().getDistrito().setProvincia(prov);
                
                CentroPoblado cp = new CentroPoblado();
                cp.setNombre(rs.getString("nomccpp"));
                
                List<CentroPoblado> listaCCPP = new ArrayList<CentroPoblado>();
                listaCCPP.add(cp);
                obj.getConglomerado().setCentrosPoblados(listaCCPP);
                
                programacionPeriodoService.setearFechaInicioByFechaInicioPeriodo1(
                        obj.getPeriodoTrabajo(),
                        rs.getString("inicio_periodo1")
                );
                
                obj.setObservacion(rs.getString("observacion"));
                
                //AGRUPANDO REPORTES
                
                String key;
                
                key = rs.getString("Año");
                ReporteAnual<ConglomeradoPersonalResumen> ranual = rep.getElemento(key);
                if(ranual==null) {
                    ranual = new ReporteAnual<ConglomeradoPersonalResumen>();
                    ranual.setAnho(key);
                    rep.agregar(key,ranual);
                }
                
                //key = obj.getConglomerado().getOdei().getCodigo();
                key = rs.getString("Odei");
                ReporteOdei<ConglomeradoPersonalResumen> rodei = ranual.getElemento(key);
                if(rodei==null) {
                    rodei = new ReporteOdei<ConglomeradoPersonalResumen>();
                    rodei.setOdei(obj.getConglomerado().getOdei());
                    ranual.agregar(key,rodei);
                }
                
                //key = obj.getConglomerado().getMes().getCodigo();
                key = rs.getString("Mes");
                ReporteMes<ConglomeradoPersonalResumen> rmes = rodei.getElemento(key);
                if(rmes==null) {                    
                    rmes = new ReporteMes<ConglomeradoPersonalResumen>();
                    Mes m = new Mes();
                    m.setCodigo(key);
                    m.setNombre(MesEnum.getNombreByCodigo(key).toUpperCase());
                    rmes.setMes(m);                    
                    rodei.agregar(key,rmes);
                    
                    //Para que el conteo sea por mes
                    ordenPersonas.clear();
                }
                
                //key = obj.getPeriodoTrabajo().getCodigo();
                key = rs.getString("Periodo1");
                ReportePeriodo<ConglomeradoPersonalResumen> rperiodo = rmes.getElemento(key);
                if(rperiodo==null) {
                    Periodo p = new Periodo();
                    p.setCodigo(key);
                    rperiodo = new ReportePeriodo<ConglomeradoPersonalResumen>();
                    rperiodo.setPeriodo(p);
                    rmes.agregar(key,rperiodo);
                }
                rperiodo.getLista().add(obj);
                
                //NUMERO DE CADA FILA
                String dni = obj.getPersonal().getDni();
                Integer orden;
                if(dni!=null) {
                    orden = ordenPersonas.get(dni);
                    if(orden==null) {
                        orden = ordenPersonas.size()+1;
                        ordenPersonas.put(dni, orden);
                    }
                }
                else
                    orden = null;
                
                obj.setNumero(orden);                
            }
        });
        
        for(ReporteAnual<ConglomeradoPersonalResumen> ranual : rep.getLista()) {
            setearTotal(ranual);
        }
        
        return rep;
    
    }
    
    private void setearTotal(ReporteAnual<ConglomeradoPersonalResumen> rep) {
        ConglomeradoPersonalResumen total = new ConglomeradoPersonalResumen();
        total.inicializarPartidas();
        for(ReporteOdei<ConglomeradoPersonalResumen> rodei : rep.getLista()) {
            setearTotal(rodei);
            total.sumar(rodei.getTotal());
        } 
        rep.setTotal(total);
    }
    
    private void setearTotal(ReporteOdei<ConglomeradoPersonalResumen> rep) {
        ConglomeradoPersonalResumen total = new ConglomeradoPersonalResumen();
        total.inicializarPartidas();
        for(ReporteMes<ConglomeradoPersonalResumen> rmes : rep.getLista()) {
            setearTotal(rmes);
            total.sumar(rmes.getTotal());
        } 
        rep.setTotal(total);
    }
    
    private void setearTotal(ReporteMes<ConglomeradoPersonalResumen> rep) {
        ConglomeradoPersonalResumen total = new ConglomeradoPersonalResumen();
        total.inicializarPartidas();
        for(ReportePeriodo<ConglomeradoPersonalResumen> rperiodo : rep.getLista()) {
            setearTotal(rperiodo);
            total.sumar(rperiodo.getTotal());
        }
        rep.setTotal(total);
    }
    
    private void setearTotal(ReportePeriodo<ConglomeradoPersonalResumen> rep) {
        ConglomeradoPersonalResumen total = new ConglomeradoPersonalResumen();
        total.inicializarPartidas();
        for(ConglomeradoPersonalResumen cpr : rep.getLista()) {
            total.sumar(cpr);
        }
        rep.setTotal(total);
    }
    
    public ReportePeriodo<ConglomeradoPersonalResumen> findReporteResumenProgramacionByFilter(Connection con, Conglomerado filtro) throws SQLException, ParseException {
        final ReportePeriodo<ConglomeradoPersonalResumen> rep = new ReportePeriodo<ConglomeradoPersonalResumen>();  
        
        Select2Jdbc s = getSelectProgramacionTrabajoCampo(filtro);
        
        s.ejecutarTodo(con, new SeteadorJdbc() {
            @Override
            public void setear(Connection con, ResultSet rs, Object obj) throws SQLException {
                rep.getLista().add((ConglomeradoPersonalResumen)obj);
            }
        });
        
        setearTotal(rep);        
        return rep;
    }
    
    private Select2Jdbc getSelectProgramacionTrabajoCampo(Conglomerado filtro) throws SQLException {
        WhereSqlDinamico w = new WhereSqlDinamico();
        w.and("C.odei=", filtro.getOdei().getCodigo());
        w.and("C.año=",filtro.getAnho());
        w.and("C.mes=",filtro.getMes().getCodigo());

        String codPer = filtro.getPeriodo().getCodigo();
        WhereSqlDinamico wPeriodo = new WhereSqlDinamico();
        if(codPer!=null) {            
            wPeriodo.and("CPD.PeriodoTrabajo=",codPer)
                    .or("C.Periodo=",codPer);
            //w.and("CPD.PeriodoTrabajo=",codPer);
        }
        else {
            if(filtro.getQuincena()!=null) {
                wPeriodo.and("CPD.PeriodoTrabajo in ",filtro.getQuincena().getCodigosPeriodo())
                    .or("C.Periodo in ",filtro.getQuincena().getCodigosPeriodo());
                //w.and("CPD.PeriodoTrabajo in ",filtro.getQuincena().getCodigosPeriodo());
            }    
        }
        
        

        w.and(wPeriodo);

        Select2Jdbc s = new Select2Jdbc(ConglomeradoPersonalResumen.class);

        s.setSelect("select \n" +
"CASE WHEN CPD.dni is null THEN 0 ELSE 1 END as asignado,\n" +
"CASE WHEN CPD.PeriodoTrabajo is not null THEN CPD.PeriodoTrabajo ELSE C.Periodo END as Periodo1,"+                    
"CASE WHEN CPD.Conglome is not null THEN CPD.Conglome ELSE C.Conglome END as Conglome1,\n" +
"C.Odei,C.Año,C.Mes,C.Periodo,C.Sede,\n" +
"D.Nombre_Dist,"+
"CPD.*, \n" +
"CPR.*, \n" +
"P.CARGO, P.NOMBRE, P.APEPATERNO, P.APEMATERNO," +
"CG.AbrCargo," + 
"A1.CodActividad as A1cod,A1.asignable as A1asig,\n" +
"A2.CodActividad as A2cod,A2.asignable as A2asig,\n" +
"A3.CodActividad as A3cod,A3.asignable as A3asig,\n" +
"A4.CodActividad as A4cod,A4.asignable as A4asig,\n" +
"A5.CodActividad as A5cod,A5.asignable as A5asig,\n" +
"A6.CodActividad as A6cod,A6.asignable as A6asig,\n" +
"A7.CodActividad as A7cod,A7.asignable as A7asig \n");

        s.setFrom("from\n" +
"(\n" +
"select \n" +
"Conglome, Dni, PeriodoTrabajo \n" +
",SUM(CASE WHEN CodPartida='232122R' THEN Monto_Diario ELSE NULL END) AS viaticos_r_monto\n" +
",SUM(CASE WHEN CodPartida='232122R' THEN Nro_Dias ELSE NULL END) AS viaticos_r_dias\n" +
",SUM(CASE WHEN CodPartida='232122U' THEN Monto_Diario ELSE NULL END) AS viaticos_u_monto\n" +
",SUM(CASE WHEN CodPartida='232122U' THEN Nro_Dias ELSE NULL END) AS viaticos_u_dias\n" +
",SUM(CASE WHEN CodPartida='232121' THEN Monto_Diario*Nro_Dias ELSE NULL END) AS pasajes\n" +
",SUM(CASE WHEN CodPartida='2321299' THEN Monto_Diario ELSE NULL END) AS movilidad_local_monto\n" +
",SUM(CASE WHEN CodPartida='2321299' THEN Nro_Dias ELSE NULL END) AS movilidad_local_dias\n" +
",SUM(CASE WHEN CodPartida='231512' THEN Monto_Diario*Nro_Dias ELSE NULL END) AS material_escritorio\n" +
",SUM(CASE WHEN CodPartida='232223' THEN Monto_Diario*Nro_Dias ELSE NULL END) AS internet\n" +
"from Campo_Conglomerado_Personal_Detalle\n" +
"group by Conglome,Dni,PeriodoTrabajo,Activo\n" +
"having Activo=1\n" +
"--order by Conglome,Dni,PeriodoTrabajo\n" +
") CPD\n");

        s.setJoin(
"inner join Campo_Conglomerado_Personal_Resumen CPR\n" +
"	on CPR.Conglome=CPD.Conglome and CPR.Dni=CPD.Dni and CPR.PeriodoTrabajo=CPD.PeriodoTrabajo\n"+                    
"right join Campo_Conglomerado C\n" +
"	on CPD.Conglome = C.Conglome\n" +
"left join Personal P\n" +
"	on CPD.Dni = P.DNI\n"+
"left join Distrito D\n" +
"	on C.Dpto=D.CCDD and C.Prov=D.CCPP and C.Dist=D.CCDI\n" +
"left join Cargo CG\n" +
"	on P.CARGO=CG.Cargo\n"+
"left join Campo_Actividad A1\n" +
"	on CPR.Actividad_Dia1=A1.CodActividad\n" +
"left join Campo_Actividad A2\n" +
"	on CPR.Actividad_Dia2=A2.CodActividad	\n" +
"left join Campo_Actividad A3\n" +
"	on CPR.Actividad_Dia3=A3.CodActividad\n" +
"left join Campo_Actividad A4\n" +
"	on CPR.Actividad_Dia4=A4.CodActividad\n" +
"left join Campo_Actividad A5\n" +
"	on CPR.Actividad_Dia5=A5.CodActividad\n" +
"left join Campo_Actividad A6\n" +
"	on CPR.Actividad_Dia6=A6.CodActividad\n" +
"left join Campo_Actividad A7\n" +
"	on CPR.Actividad_Dia7=A7.CodActividad"        
        );
        
        s.setWhereHaving(w.getSql());
        
        s.setOrderby("order by asignado desc,Año,Odei,Mes,Periodo1,cargo desc,P.APEPATERNO");
        
        SeteadorJdbc<ConglomeradoPersonalResumen> f = new SeteadorJdbc<ConglomeradoPersonalResumen>() {
            
            @Override
            public void setear(Connection con, ResultSet rs, ConglomeradoPersonalResumen obj) throws SQLException {

                //Conglomerado c = findConglomeradoParaVistaBuscarByCodigo(con,);//DEMORA LA CONSULTA
                
                Conglomerado c = new Conglomerado();                
                obj.setConglomerado(c);
                
                Odei od = new Odei();
                od.setCodigo(rs.getString("odei"));
                c.setOdei(od);
                
                c.setCodigo(rs.getString("conglome1"));
                c.setAreaGeografica(AreaGeografica.findByCodigo(rs.getString("sede")));
                Distrito d = new Distrito();
                d.setNombre(rs.getString("nombre_dist"));
                c.setDistrito(d);
                
                Periodo p = new Periodo();
                p.setCodigo(rs.getString("periodo"));
                c.setPeriodo(p);
                c.setAnho(rs.getString("año"));
                Mes mes = new Mes();
                mes.setCodigo(rs.getString("mes"));                       
                c.setMes(mes);

                //obj.setPersonal(findPersona_paraVistaResumenByDni(con,rs.getString("dni")));//DEMORA LA CONSULTA
                Encuestador e = new Encuestador();
                e.setDni(rs.getString("dni"));
                e.setNombres(rs.getString("NOMBRE"));
                e.setApellidoPaterno(rs.getString("APEPATERNO"));
                e.setApellidoMaterno(rs.getString("APEMATERNO"));
                
                Cargo cg = new Cargo();
                cg.setAbreviatura(rs.getString("AbrCargo"));
                e.setCargo(cg);
                obj.setPersonal(e);

                Periodo pt = new Periodo();
                pt.setCodigo(rs.getString("periodoTrabajo"));
                obj.setPeriodoTrabajo(pt);

                obj.setViaticosR(new ConglomeradoPersonalDetalle(rs.getString("viaticos_r_monto"),rs.getString("viaticos_r_dias")));
                obj.setViaticosU(new ConglomeradoPersonalDetalle(rs.getString("viaticos_u_monto"),rs.getString("viaticos_u_dias")));
                obj.setPasajes(new ConglomeradoPersonalDetalle(rs.getString("pasajes")));
                obj.setMovilidadLocal(new ConglomeradoPersonalDetalle(rs.getString("movilidad_local_monto"),rs.getString("movilidad_local_dias")));
                obj.setMaterialEscritorio(new ConglomeradoPersonalDetalle(rs.getString("material_escritorio")));
                obj.setInternet(new ConglomeradoPersonalDetalle(rs.getString("internet")));

                //setearDiasActividad(con,rs,obj);//DEMORA LA CONSULTA
                Actividad a1 = new Actividad();
                a1.setCodigo(rs.getString("A1cod"));
                a1.setAsignable(rs.getBoolean("A1asig"));
                obj.setActividadDiaLunes(a1);
                a1.setConglomeradoPersonalResumen(obj);

                Actividad a2 = new Actividad();
                a2.setCodigo(rs.getString("A2cod"));
                a2.setAsignable(rs.getBoolean("A2asig"));
                obj.setActividadDiaMartes(a2);
                a2.setConglomeradoPersonalResumen(obj);

                Actividad a3 = new Actividad();
                a3.setCodigo(rs.getString("A3cod"));
                a3.setAsignable(rs.getBoolean("A3asig"));
                obj.setActividadDiaMiercoles(a3);
                a3.setConglomeradoPersonalResumen(obj);

                Actividad a4 = new Actividad();
                a4.setCodigo(rs.getString("A4cod"));
                a4.setAsignable(rs.getBoolean("A4asig"));
                obj.setActividadDiaJueves(a4);
                a4.setConglomeradoPersonalResumen(obj);

                Actividad a5 = new Actividad();
                a5.setCodigo(rs.getString("A5cod"));
                a5.setAsignable(rs.getBoolean("A5asig"));
                obj.setActividadDiaViernes(a5);
                a5.setConglomeradoPersonalResumen(obj);

                Actividad a6 = new Actividad();
                a6.setCodigo(rs.getString("A6cod"));
                a6.setAsignable(rs.getBoolean("A6asig"));
                obj.setActividadDiaSabado(a6);
                a6.setConglomeradoPersonalResumen(obj);

                Actividad a7 = new Actividad();
                a7.setCodigo(rs.getString("A7cod"));
                a7.setAsignable(rs.getBoolean("A7asig"));
                obj.setActividadDiaDomingo(a7);
                a7.setConglomeradoPersonalResumen(obj);
            }
        };        
        s.agregarSeteador(f);
        return s;
    }
        
    public void setearPartidasNoDiarias(Connection con, ConglomeradoPersonalResumen comando) throws SQLException {
        List<ConglomeradoPersonalDetalle> lista = new ArrayList<ConglomeradoPersonalDetalle>();        
        List<Partida> partidas = this.partidaService.findPartidasNoDiarias(con);
        
        List<ConglomeradoPersonalDetalle> partidasBD = comando.getPartidasNoDiarias();
        if(partidasBD==null || partidasBD.isEmpty()) {
            for(Partida p: partidas) {
                ConglomeradoPersonalDetalle cpd = new ConglomeradoPersonalDetalle();
                cpd.setPartida(p);
                lista.add(cpd);
            }
        }
        else {
            Map<String,ConglomeradoPersonalDetalle> map = new HashMap<String,ConglomeradoPersonalDetalle>();
            for(ConglomeradoPersonalDetalle cpdBD :partidasBD) {
                map.put(cpdBD.getPartida().getCodigo(),cpdBD);
            }
            
            for(Partida p: partidas) {         
                ConglomeradoPersonalDetalle cpdBD = map.get(p.getCodigo());
                if(cpdBD==null) {
                    cpdBD = new ConglomeradoPersonalDetalle();
                }
                
                cpdBD.setPartida(p);
                lista.add(cpdBD);
            }
        }
        
        
        comando.setPartidasNoDiarias(lista);       
    }
    
    public void setearDiasActividad(Connection con, ResultSet rs, ConglomeradoPersonalResumen obj) throws SQLException {
        obj.setActividadDiaLunes(actividadService.findByCodigo(con, rs.getString("Actividad_Dia1")));
        obj.setActividadDiaMartes(actividadService.findByCodigo(con, rs.getString("Actividad_Dia2")));
        obj.setActividadDiaMiercoles(actividadService.findByCodigo(con, rs.getString("Actividad_Dia3")));
        obj.setActividadDiaJueves(actividadService.findByCodigo(con, rs.getString("Actividad_Dia4")));
        obj.setActividadDiaViernes(actividadService.findByCodigo(con, rs.getString("Actividad_Dia5")));
        obj.setActividadDiaSabado(actividadService.findByCodigo(con, rs.getString("Actividad_Dia6")));
        obj.setActividadDiaDomingo(actividadService.findByCodigo(con, rs.getString("Actividad_Dia7")));
    }
    
    public ConglomeradoPersonalResumen findByFiltro(Connection con, final ConglomeradoPersonalResumen filtro) throws SQLException {
        Select2Jdbc select = new Select2Jdbc(ConglomeradoPersonalResumen.class);
        select.setSelect("select *");
        select.setFrom("from Campo_Conglomerado_Personal_Resumen");       
        
        WhereSql w = new WhereSql();
        w.and("conglome=",filtro.getConglomerado().getCodigo());
        w.and("dni=",filtro.getPersonal().getDni());
        w.and("periodoTrabajo=",filtro.getPeriodoTrabajo().getCodigo());        
        select.setWhereHaving(w.getSql()); 
        
        select.agregarSeteador(new SeteadorJdbc<ConglomeradoPersonalResumen>() {
            @Override
            public void setear(Connection con, ResultSet rs, ConglomeradoPersonalResumen obj) throws SQLException {
                
                obj.setConglomerado(filtro.getConglomerado());
                obj.setPersonal(filtro.getPersonal());
                obj.setPeriodoTrabajo(filtro.getPeriodoTrabajo());
                setearDiasActividad(con,rs,obj);
                obj.setObservacion(rs.getString("Observacion"));
                
                conglomeradoPersonalDetalleService.setearDetalle(con,obj);
            }
        });        
        return (ConglomeradoPersonalResumen) select.getPrimerElemento(con);
    }
    
    public List<Encuestador> findPosiblesEncuestadoresActivosExceptoAsignadosAlConglomeradoPeriodoTrabajo_codigoNombreNroEntrevistasAnhoPasado_siTrabajoConglomerado(Connection con, String codigoConglomerado, String codigoPeriodoTrabajo) throws SQLException {
        Conglomerado c = conglomeradoService.findByCodigo(con, codigoConglomerado);                
        WhereSqlCond w = new WhereSqlCond();
        
        //1. Personal que aun no ha sido asignado al conglomerado
        w.agregarCondicion("P.dni not in (select Dni from Campo_Conglomerado_Personal_Resumen where Conglome='"+codigoConglomerado+"' and PeriodoTrabajo='"+codigoPeriodoTrabajo+"')");
        
        //2. Personal de la ODEI del conglomerado
        w.agregarCondicion("ODEI='"+c.getOdei().getCodigo()+"'");
        
        List<Encuestador> lista = encuestadorService.findPosiblesEncuestadoresActivos_codigoNombreCargoNroEntrevistasAnhoPasado(con, w);
        encuestadorService.setearSiTrabajoConglomeradoElAnhoPasado(con,lista,codigoConglomerado);
        return lista;
    }
    
    
    //No usarlo en FOR. Es lento.
    public Conglomerado findConglomeradoParaVistaEditarByCodigo(Connection con, String codigo) throws SQLException {
        SeteadorJdbc<Conglomerado> seteador = new SeteadorJdbc<Conglomerado>() {
            @Override
            public void setear(Connection con, ResultSet rs, Conglomerado obj) throws SQLException {
                conglomeradoService.setearOdei(con, rs, obj);
                conglomeradoService.setearAnhoMesPeriodoConFechaInicio(con,rs, obj);
                conglomeradoService.setearTipoSeleccion(rs, obj);
                conglomeradoService.setearDistrito(con, rs, obj);
                conglomeradoService.setearCentrosPoblados(con, obj);
                conglomeradoService.setearSede(rs, obj);
            }
        };
        return conglomeradoService.findByCodigo(con, codigo, seteador);
    }
    
    public Conglomerado findConglomeradoParaVistaBuscarByCodigo(Connection con, String codigo) throws SQLException {
        SeteadorJdbc<Conglomerado> seteador = new SeteadorJdbc<Conglomerado>() {
            @Override
            public void setear(Connection con, ResultSet rs, Conglomerado obj) throws SQLException {                
                conglomeradoService.setearDistrito(con, rs, obj);
                conglomeradoService.setearSede(rs, obj);
            }
        };
        return conglomeradoService.findByCodigo(con, codigo, seteador);
    }
    
    private Personal findPersona_paraVistaResumenByDni(Connection con, String dni) throws SQLException {
        if(StringUtil.esVacioONulo(dni))
            return null;
        
        SeteadorJdbc<Personal> seteador = new SeteadorJdbc<Personal>() {
            @Override
            public void setear(Connection con, ResultSet rs, Personal obj) throws SQLException {                
                personalService.setearNombresApellidos(con,rs,obj);
                personalService.setearCargo(con,rs,obj);
            }
        };
        return personalService.findByDni(con, dni, seteador);
    }
    
    
    
    
    
    public void guardar_actualizar(Connection con, ConglomeradoPersonalResumen comando) throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = con.prepareStatement("select * from Campo_Conglomerado_Personal_Resumen"
                    + " where conglome=? and dni=? and periodoTrabajo=?");
            
            ps.setString(1,comando.getConglomerado().getCodigo());
            ps.setString(2,comando.getPersonal().getDni());
            ps.setString(3,comando.getPeriodoTrabajo().getCodigo());
                        
            ResultSet rs = ps.executeQuery();
            if(rs.next()) {
                actualizar(con,comando);
            }
            else {
                guardar(con,comando);
            }
            
            conglomeradoPersonalDetalleService.guardar_actualizar_detalle(con, comando);
            
        } finally {            
            if(ps!=null) ps.close();
        }
    } 
    
    public void guardar(Connection con, ConglomeradoPersonalResumen comando) throws SQLException {
        PreparedStatement ps = null;
        try { 
            ps = con.prepareStatement("insert into "
                    + "Campo_Conglomerado_Personal_Resumen(conglome, dni, periodoTrabajo,"
                    + "Actividad_Dia1,"
                    + "Actividad_Dia2,"
                    + "Actividad_Dia3,"
                    + "Actividad_Dia4,"
                    + "Actividad_Dia5,"
                    + "Actividad_Dia6,"
                    + "Actividad_Dia7,"
                    + "Observacion) values (?,?,?,"
                    + "?,"
                    + "?,"
                    + "?,"
                    + "?,"
                    + "?,"
                    + "?,"
                    + "?,"
                    + "?)");
            
            ps.setString(1,comando.getConglomerado().getCodigo());
            ps.setString(2,comando.getPersonal().getDni());
            ps.setString(3,comando.getPeriodoTrabajo().getCodigo());
            
            ps.setString(4,comando.getActividadDiaLunes().getCodigo());
            ps.setString(5,comando.getActividadDiaMartes().getCodigo());
            ps.setString(6,comando.getActividadDiaMiercoles().getCodigo());
            ps.setString(7,comando.getActividadDiaJueves().getCodigo());
            ps.setString(8,comando.getActividadDiaViernes().getCodigo());
            ps.setString(9,comando.getActividadDiaSabado().getCodigo());
            ps.setString(10,comando.getActividadDiaDomingo().getCodigo());
                        
            ps.setString(11,comando.getObservacion());
            
            ps.executeUpdate();
        } finally {            
            if(ps!=null) ps.close();
        }
    }  
    
    public void actualizar(Connection con, ConglomeradoPersonalResumen comando) throws SQLException {
        PreparedStatement ps = null;
        try { 
            ps = con.prepareStatement("update Campo_Conglomerado_Personal_Resumen "
                    + "set "
                    + "Actividad_Dia1=?,"
                    + "Actividad_Dia2=?,"
                    + "Actividad_Dia3=?,"
                    + "Actividad_Dia4=?,"
                    + "Actividad_Dia5=?,"
                    + "Actividad_Dia6=?,"
                    + "Actividad_Dia7=?,"
                    + "Observacion=?"
                    + " where conglome=? and dni=? and periodoTrabajo=?");
            
            ps.setString(1,comando.getActividadDiaLunes().getCodigo());
            ps.setString(2,comando.getActividadDiaMartes().getCodigo());
            ps.setString(3,comando.getActividadDiaMiercoles().getCodigo());
            ps.setString(4,comando.getActividadDiaJueves().getCodigo());
            ps.setString(5,comando.getActividadDiaViernes().getCodigo());
            ps.setString(6,comando.getActividadDiaSabado().getCodigo());
            ps.setString(7,comando.getActividadDiaDomingo().getCodigo());            
            ps.setString(8,comando.getObservacion());
            
            ps.setString(9,comando.getConglomerado().getCodigo());
            ps.setString(10,comando.getPersonal().getDni());
            ps.setString(11,comando.getPeriodoTrabajo().getCodigo());
            
            ps.executeUpdate();
        } finally {            
            if(ps!=null) ps.close();
        }
    }
    
    
    public void eliminar(Connection con, ConglomeradoPersonalResumen filtro) throws SQLException {
        PreparedStatement ps = null;
        try {             
            this.conglomeradoPersonalDetalleService.eliminar_detalle(con, filtro);
            
            ps = con.prepareStatement("delete from Campo_Conglomerado_Personal_Resumen"
                    + " where conglome=? and dni=? and periodoTrabajo=?");
            
            ps.setString(1,filtro.getConglomerado().getCodigo());
            ps.setString(2,filtro.getPersonal().getDni());
            ps.setString(3,filtro.getPeriodoTrabajo().getCodigo());

            ps.executeUpdate();            
        } finally {            
            if(ps!=null) ps.close();
        }
    }

    public PersonalService getPersonalService() {
        return personalService;
    }

    public void setPersonalService(PersonalService personalService) {
        this.personalService = personalService;
    }

    public ConglomeradoService getConglomeradoService() {
        return conglomeradoService;
    }

    public void setConglomeradoService(ConglomeradoService conglomeradoService) {
        this.conglomeradoService = conglomeradoService;
    }

    

    public ActividadService getActividadService() {
        return actividadService;
    }

    public void setActividadService(ActividadService actividadService) {
        this.actividadService = actividadService;
    }

    public PartidaService getPartidaService() {
        return partidaService;
    }

    public void setPartidaService(PartidaService partidaService) {
        this.partidaService = partidaService;
    }

    public MesService getMesService() {
        return mesService;
    }

    public void setMesService(MesService mesService) {
        this.mesService = mesService;
    }

    public OdeiService getOdeiService() {
        return odeiService;
    }

    public void setOdeiService(OdeiService odeiService) {
        this.odeiService = odeiService;
    }

    public PeriodoService getPeriodoService() {
        return periodoService;
    }

    public void setPeriodoService(PeriodoService periodoService) {
        this.periodoService = periodoService;
    }

    public EncuestadorService getEncuestadorService() {
        return encuestadorService;
    }

    public void setEncuestadorService(EncuestadorService encuestadorService) {
        this.encuestadorService = encuestadorService;
    }

    public ProgramacionPeriodoService getProgramacionPeriodoService() {
        return programacionPeriodoService;
    }

    public void setProgramacionPeriodoService(ProgramacionPeriodoService programacionPeriodoService) {
        this.programacionPeriodoService = programacionPeriodoService;
    }

    public ConglomeradoPersonalDetalleService getConglomeradoPersonalDetalleService() {
        return conglomeradoPersonalDetalleService;
    }

    public void setConglomeradoPersonalDetalleService(ConglomeradoPersonalDetalleService conglomeradoPersonalDetalleService) {
        this.conglomeradoPersonalDetalleService = conglomeradoPersonalDetalleService;
    }

    

}
